project(real_project_main)
# 前缀一致, 表示该project实际上是从属于上一个project(real_project)的

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/process)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/pnc_map)
# 先编译这俩库, 待会链接会用到

add_executable(real_project_main)
# 老版的helloworld.cpp一般是在这里加上源文件add_executable(real_project_main main.cpp), 但是现代的CMake推荐使用target_sources, 因为可以更灵活地控制源文件的属性PRIVATE INTERFACE PUBLIC

target_sources(real_project_main 
PRIVATE
# INTERFACE PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
)

target_link_libraries(real_project_main
PRIVATE
    process
) 
# 因为上层的cmake已经设置了CMAKE_ARCHIVE_OUTPUT_DIRECTORY和CMAKE_LIBRARY_OUTPUT_DIRECTORY为/ai/zhuxs/cpp_learn/cmake_git_learn_bilibili/complicated_real_project/lib, 所以这里不需要再设置也可以找得到
# 这里不用额外设置target_include_directories, 我待会会把库的头文件路径使用INTERFACE/PUBLIC进行传递, 所有链接到process的库都会自动获得这些头文件路径


# 什么是依赖库, 什么是依赖头文件
# pnc_map.h声明了类PNC_Map和函数mapInfo, 函数mapInfo在pnc_map.cpp中实现, Process.h对PNC_Map类实例化, 这就是依赖头文件, 因为Process.h需要知道PNC_Map类的定义, 而在Process.cpp中需要知道mapInfo函数的实现, 这就是依赖库, 因为Process.cpp需要调用mapInfo函数


# 什么是隐式依赖和显示依赖和动态库的延迟解析
# real_project_main(可执行文件)依赖process(动态库), process依赖pnc_map(动态库)
# process如果是可执行文件就必须链接pnc_map才能build, 但是process作为动态库不链接pnc_map也可以build, 因为process是动态库, 它的链接发生在运行时, 而不是build时, 所以process在build时可以不需要知道mapInfo的实现, 该符号会被标记为"运行时解析"(所谓的延迟解析), 如果process没有target_link_libraries链接pnc_map, 那么ldd build出来的process也会发现process没有依赖pnc_map(隐式依赖, 依赖链不透明)
# 但是这样的话, 在build可执行文件real_project_main的时候就必须target_link_libraries链接process和pnc_map两个库, 
# target_link_libraries(real_project_main
# PRIVATE
#     process
#     pnc_map
# )
# 这是因为, 可执行文件的链接发生在build阶段, real_project_main链接了process, 然后会去解析process中所有的未定义符号, 此时必须确保pnc_map库在real_project_main的context里面, 才能解析并对应这些未定义符号, 这种一般称为"隐式依赖"
# 隐式依赖显然不如显示依赖好, 如果又有一个可执行文件c依赖process, 那么如果他不知道process依赖pnc_map但是没有链接, 那么他只链接了process显然会build不出来